在MicroBlaze上创建机器人弹奏手
2014/3/3 10:42:43
为了设计出可以演奏管风琴的机器人,我所在的dorkbot Edinburgh团队(旨在推进工程科学界与艺术界之间的草根协作的非正式组织)开展了“WaldflÖte项目”。经过7个月的思考、探究和讨论,我们最终设计出几种操纵管风琴键盘的方式。
采用正确的机械部件
在开发的初始阶段我们就明确地将问题分为机械和电子两部分。如果我们能够找到解决机械问题的方案,就能相对独立地打造这两个部分。
资金是设计的主要因素之一。我们走遍尾货市场,找到了一些价格合适的电磁铁。我们能够以1英磅(约合1.5美元)左右的单价得到100个这样的电磁铁,于是订购了6个在管风琴上进行试验。
电磁铁的尺寸非常理想,但电磁铁芯的运动距离比要始终如一地触动管风琴白键所需的运动距离略短。尽管我们可以直接利用电磁铁芯来驱动黑键,但还是需要某种杠杆来驱动白键。
图1 电磁体组件原型
电磁铁组装的首个原型如图1所示,图2为电磁铁的工作原理图。对于白键而言,顶部的胶合板杠杆的后面用管道胶带作铰链连接,当电磁铁通电时,它会受到下拉的力量。当电磁铁断电时,管风琴键自身会提供向上力——因此无需另外使用弹簧。对于黑键而言,从电磁铁底部伸出的小销具有足够的力量,可以直接按压琴键,弹奏音符。
图2 机械布局
组件测试表明设计的确可以成功地按压琴键。同时也表明,我无法做到将放置电磁铁的空间七等分,其间隔无法接近键盘八度音阶的实际间隔,因此,我们只能一次测试一个键。但我们证实了这个原理是可行的,因此,我们订购了适用于整个键盘的部件,然后开始着手电子设计。
图3 基本电子结构图
电子设计
在进行电子设计时,我们粗略地设计出电子结构,图3为基本结构图。在图的左侧,MIDI(乐器数字接口)消息由外部传入(我将在下文详细介绍MIDI协议)。图的右侧是一个位移寄存器链。控制器在驱动相应的“数据”值填充位移寄存器链时负责切换“时钟”信号,然后通过“选通”信号将位移寄存器链的内容并行发送至电磁铁驱动器的输入端。
我们在位移寄存器/驱动器链上采用了74HC595位移寄存器IC。电磁铁试验显示每个电磁铁大约需要15V电源提供350mA驱动电流——这超出了CMOS输出级的提供范围。为了满足这个要求,我们在每个位移寄存器IC上增加了一个ULN2803A达林顿输出级。这个芯片还具备一个保护二极管,对切断电流时电磁铁生成的高反激电压进行分流,避免增加一个分立式二极管。我们在万用板上制作了几个驱动器电路板原型,每个可驱动16个电磁铁。
控制器设计
可以采取多种方法设计控制器(包括利用Arduino平台或采用其他微控制器)。我们最终选择使用Spartan-3E入门套件,一是因为我在日常工作中用过这种开发板,对相关工具了如指掌。特别是我知道如何使用Platform Studio SDK和ChipScope等调试工具。由于机器弹奏风琴有可能是一个现场调试项目,这样做可以节省时间。这里,我们使用赛灵思嵌入式开发套件开发核心组件MicroBlaze子系统,如图4所示。
图4 MicroBlaze子系统
除了MIDI接口和位移寄存器接口,我们还选择增加了串行RS-232控制端口,以帮助调试系统。RS-232协议看起来有点老套,但在此类项目中,它很有价值。我们也增加了一些GPIO端口,用于驱动LED,读取开关和按钮,以便在无需使用控制端口的情况下完成某些交互操作。
写入MicroBlaze固件
自20世纪80年代以来,MIDI已经成为连接合成器等数控乐器与其他乐器或控制计算机的标准接口,因此,我们确定系统的最佳输入接口是MIDI端口。
MIDI是一种单向低速串行协议,传输速率为31250波特。它包含多种类型的信息,但就我们的目标应用而言,只有NOTE ON和NOTE OFF是重要的信息类型。每个NOTE ON信息由3个字节构成:第一个字节是0x9n,这里的n代表通道数;第二个字节是0~127的音符数,中间的C为第60号;第三个字节是0~127的速度值。
NOTE OFF除第一个字节是0x8n外,其余与此非常相似。
在设计中,我们决定同步听取所有通道的信息(“omni”操作)。由于管风琴键盘对速度并不敏感,因此可以忽略所有速度字节。
EDK UART IP核接收MIDI消息,然后通过FIFO,一次向MicroBlaze处理器发送一条信息。MicroBlaze可从内部显示整个键盘的状态和系统正在按压哪些键(即系统正在为哪些电磁铁加电)。固件采用一个静态查找表,指出与这个音符相关的电磁铁,将这个静态查找表用做内部图的索引;到达的NOTE ON消息将相应entry值设为“1”,而NOTE OFF消息将entry值设为“0”。
内部图更新后,利用图的全部内容更新电磁铁寄存器。通过GPIO端口的位拆解,MicroBlaze处理器一次将一位的图内容写入位移寄存器的数据输入端,然后切换时钟信号,移动一下位移寄存器。一旦利用图内容对整个位移寄存器进行了更新,MicroBlaze会将一个上升沿写入STROBE行,这能够将位移寄存器的值拷贝至输出寄存器,为正确的电磁铁加电或断电,从而产生悦耳的音乐。
我们将固件用作软件状态机。对于不采用实时操作系统的嵌入式应用而言,这可提供某些多线程应用功能,但没有实际线程实现开销。静态结构数组根据当前的状态,指出系统针对特定事件应当采取什么措施。
const midi_state_table_entry_t MIDI_STATE_TABLE[] =
{
{INHIBITED,PANIC,
MidiSM_Panic,INHIBITED},
{ANY_STATE,PANIC,
MidiSM_Panic,INIT},
{ANY_STATE,INHIBIT,
MidiSM_DoNothing,INHIBITED},
{ANY_STATE,OTHER_STATUS_RECEIVED,MidiSM_ClearMessage,INIT},
{INIT,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte,NOTE_ON_OR_OFF},
{INIT,DATA_RECEIVED,
MidiSM_DoNothing,INIT},
{NOTE_ON_OR_OFF,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte,NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF,DATA_RECEIVED,MidiSM_StoreNoteNumber,NOTE_ON_OR_OFF_NUMBER},
{NOTE_ON_OR_OFF_NUMBER,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte, NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF_NUMBER,DATA_RECEIVED,MidiSM_NoteOnOrOffComplete,NOTE_ON_OR_OFF},
{INHIBITED,ENABLE,
MidiSM_DoNothing,INIT},
{LAST_STATE, LAST_EVENT, 0,LAST_STATE},
};
在该结构体中的第一个entry表示当前状态;第二个entry表示事件到达;第三个entry表示处理该事件需要使用状态转换功能;第四个 entry表示下一状态。
状态机业务端采用的代码如下:
XStatus MidiSM_
DoStateTransition
(midi_state_machine_t *pInstance,u8 event)
{
const midi_state_table_
entry_t *pTable = pInstance-
>pStateTable;
// Search for a match in the
state table
do {
if ((event == pTable-
>received_event)
&& ((pInstance-
>current_state == pTable-
>state)
|| (pTable->state ==
ANY_STATE)))
{
(*pTable-
>transition_function)((v
oid *)pInstance);
pInstance->current_state
= pTable->next_state;
return XST_
SUCCESS;
}
pTable++;
} while (pTable->state !=LAST_STATE);
// Aaargh, something bad happened - should never get here
XASSERT_NONVOID_ALWAYS();
}
事件循环提供的事件是对这种功能的论证,根据当前的状态和事件,采取某种措施和改变系统状态。事件的类型包括字节到达MIDI接口,字符到达控制端口和按下重启按钮。重启按钮是保护耳朵和电源必备的特性——它可无条件地关闭所有电磁铁,使系统恢复到已知安全状态。
演奏WaldflÖe
电磁铁木制背板隐藏在琴键底部,每块板上安装30个或更多的电磁铁,同时还安装了一些回收利用的罐状电容器,为电磁铁提供电能。我们将整个驱动器组件与管风琴连接,利用回收利用的CAT5电缆将Spartan-3E入门套件开发板和接口万用板与驱动器组件连接。
我们利用这套系统成功演奏了一些非常复杂、快节奏的音乐,从古典到摇滚。电磁铁和驱动器在速度方面并没有表现出太大的局限性。即使在弹奏要求最苛刻的曲目时,电磁铁电源在15V电压条件下通常电流不超过4A。即使我们稍微过度使用电磁铁,电磁铁线圈也没有出现明显升温的情况。总而言之,我们对这个系统非常满意,同时为参与开发这套系统深感自豪。
作者:赛灵思公司设计经理 Gareth Edwards
来源:电子设计应用2009年第8期
采用正确的机械部件
在开发的初始阶段我们就明确地将问题分为机械和电子两部分。如果我们能够找到解决机械问题的方案,就能相对独立地打造这两个部分。
资金是设计的主要因素之一。我们走遍尾货市场,找到了一些价格合适的电磁铁。我们能够以1英磅(约合1.5美元)左右的单价得到100个这样的电磁铁,于是订购了6个在管风琴上进行试验。
电磁铁的尺寸非常理想,但电磁铁芯的运动距离比要始终如一地触动管风琴白键所需的运动距离略短。尽管我们可以直接利用电磁铁芯来驱动黑键,但还是需要某种杠杆来驱动白键。
图1 电磁体组件原型
电磁铁组装的首个原型如图1所示,图2为电磁铁的工作原理图。对于白键而言,顶部的胶合板杠杆的后面用管道胶带作铰链连接,当电磁铁通电时,它会受到下拉的力量。当电磁铁断电时,管风琴键自身会提供向上力——因此无需另外使用弹簧。对于黑键而言,从电磁铁底部伸出的小销具有足够的力量,可以直接按压琴键,弹奏音符。
图2 机械布局
组件测试表明设计的确可以成功地按压琴键。同时也表明,我无法做到将放置电磁铁的空间七等分,其间隔无法接近键盘八度音阶的实际间隔,因此,我们只能一次测试一个键。但我们证实了这个原理是可行的,因此,我们订购了适用于整个键盘的部件,然后开始着手电子设计。
图3 基本电子结构图
电子设计
在进行电子设计时,我们粗略地设计出电子结构,图3为基本结构图。在图的左侧,MIDI(乐器数字接口)消息由外部传入(我将在下文详细介绍MIDI协议)。图的右侧是一个位移寄存器链。控制器在驱动相应的“数据”值填充位移寄存器链时负责切换“时钟”信号,然后通过“选通”信号将位移寄存器链的内容并行发送至电磁铁驱动器的输入端。
我们在位移寄存器/驱动器链上采用了74HC595位移寄存器IC。电磁铁试验显示每个电磁铁大约需要15V电源提供350mA驱动电流——这超出了CMOS输出级的提供范围。为了满足这个要求,我们在每个位移寄存器IC上增加了一个ULN2803A达林顿输出级。这个芯片还具备一个保护二极管,对切断电流时电磁铁生成的高反激电压进行分流,避免增加一个分立式二极管。我们在万用板上制作了几个驱动器电路板原型,每个可驱动16个电磁铁。
控制器设计
可以采取多种方法设计控制器(包括利用Arduino平台或采用其他微控制器)。我们最终选择使用Spartan-3E入门套件,一是因为我在日常工作中用过这种开发板,对相关工具了如指掌。特别是我知道如何使用Platform Studio SDK和ChipScope等调试工具。由于机器弹奏风琴有可能是一个现场调试项目,这样做可以节省时间。这里,我们使用赛灵思嵌入式开发套件开发核心组件MicroBlaze子系统,如图4所示。
图4 MicroBlaze子系统
除了MIDI接口和位移寄存器接口,我们还选择增加了串行RS-232控制端口,以帮助调试系统。RS-232协议看起来有点老套,但在此类项目中,它很有价值。我们也增加了一些GPIO端口,用于驱动LED,读取开关和按钮,以便在无需使用控制端口的情况下完成某些交互操作。
写入MicroBlaze固件
自20世纪80年代以来,MIDI已经成为连接合成器等数控乐器与其他乐器或控制计算机的标准接口,因此,我们确定系统的最佳输入接口是MIDI端口。
MIDI是一种单向低速串行协议,传输速率为31250波特。它包含多种类型的信息,但就我们的目标应用而言,只有NOTE ON和NOTE OFF是重要的信息类型。每个NOTE ON信息由3个字节构成:第一个字节是0x9n,这里的n代表通道数;第二个字节是0~127的音符数,中间的C为第60号;第三个字节是0~127的速度值。
NOTE OFF除第一个字节是0x8n外,其余与此非常相似。
在设计中,我们决定同步听取所有通道的信息(“omni”操作)。由于管风琴键盘对速度并不敏感,因此可以忽略所有速度字节。
EDK UART IP核接收MIDI消息,然后通过FIFO,一次向MicroBlaze处理器发送一条信息。MicroBlaze可从内部显示整个键盘的状态和系统正在按压哪些键(即系统正在为哪些电磁铁加电)。固件采用一个静态查找表,指出与这个音符相关的电磁铁,将这个静态查找表用做内部图的索引;到达的NOTE ON消息将相应entry值设为“1”,而NOTE OFF消息将entry值设为“0”。
内部图更新后,利用图的全部内容更新电磁铁寄存器。通过GPIO端口的位拆解,MicroBlaze处理器一次将一位的图内容写入位移寄存器的数据输入端,然后切换时钟信号,移动一下位移寄存器。一旦利用图内容对整个位移寄存器进行了更新,MicroBlaze会将一个上升沿写入STROBE行,这能够将位移寄存器的值拷贝至输出寄存器,为正确的电磁铁加电或断电,从而产生悦耳的音乐。
我们将固件用作软件状态机。对于不采用实时操作系统的嵌入式应用而言,这可提供某些多线程应用功能,但没有实际线程实现开销。静态结构数组根据当前的状态,指出系统针对特定事件应当采取什么措施。
const midi_state_table_entry_t MIDI_STATE_TABLE[] =
{
{INHIBITED,PANIC,
MidiSM_Panic,INHIBITED},
{ANY_STATE,PANIC,
MidiSM_Panic,INIT},
{ANY_STATE,INHIBIT,
MidiSM_DoNothing,INHIBITED},
{ANY_STATE,OTHER_STATUS_RECEIVED,MidiSM_ClearMessage,INIT},
{INIT,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte,NOTE_ON_OR_OFF},
{INIT,DATA_RECEIVED,
MidiSM_DoNothing,INIT},
{NOTE_ON_OR_OFF,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte,NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF,DATA_RECEIVED,MidiSM_StoreNoteNumber,NOTE_ON_OR_OFF_NUMBER},
{NOTE_ON_OR_OFF_NUMBER,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte, NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF_NUMBER,DATA_RECEIVED,MidiSM_NoteOnOrOffComplete,NOTE_ON_OR_OFF},
{INHIBITED,ENABLE,
MidiSM_DoNothing,INIT},
{LAST_STATE, LAST_EVENT, 0,LAST_STATE},
};
在该结构体中的第一个entry表示当前状态;第二个entry表示事件到达;第三个entry表示处理该事件需要使用状态转换功能;第四个 entry表示下一状态。
状态机业务端采用的代码如下:
XStatus MidiSM_
DoStateTransition
(midi_state_machine_t *pInstance,u8 event)
{
const midi_state_table_
entry_t *pTable = pInstance-
>pStateTable;
// Search for a match in the
state table
do {
if ((event == pTable-
>received_event)
&& ((pInstance-
>current_state == pTable-
>state)
|| (pTable->state ==
ANY_STATE)))
{
(*pTable-
>transition_function)((v
oid *)pInstance);
pInstance->current_state
= pTable->next_state;
return XST_
SUCCESS;
}
pTable++;
} while (pTable->state !=LAST_STATE);
// Aaargh, something bad happened - should never get here
XASSERT_NONVOID_ALWAYS();
}
事件循环提供的事件是对这种功能的论证,根据当前的状态和事件,采取某种措施和改变系统状态。事件的类型包括字节到达MIDI接口,字符到达控制端口和按下重启按钮。重启按钮是保护耳朵和电源必备的特性——它可无条件地关闭所有电磁铁,使系统恢复到已知安全状态。
演奏WaldflÖe
电磁铁木制背板隐藏在琴键底部,每块板上安装30个或更多的电磁铁,同时还安装了一些回收利用的罐状电容器,为电磁铁提供电能。我们将整个驱动器组件与管风琴连接,利用回收利用的CAT5电缆将Spartan-3E入门套件开发板和接口万用板与驱动器组件连接。
我们利用这套系统成功演奏了一些非常复杂、快节奏的音乐,从古典到摇滚。电磁铁和驱动器在速度方面并没有表现出太大的局限性。即使在弹奏要求最苛刻的曲目时,电磁铁电源在15V电压条件下通常电流不超过4A。即使我们稍微过度使用电磁铁,电磁铁线圈也没有出现明显升温的情况。总而言之,我们对这个系统非常满意,同时为参与开发这套系统深感自豪。
作者:赛灵思公司设计经理 Gareth Edwards
来源:电子设计应用2009年第8期
提交
查看更多评论
其他资讯
工业机器人控制系统的开放体系结构
工业机器人离线编程及无碰撞路径规划系统的开发研究
工业机器人手臂结构的有限元分析与研究
工业机器人通用控制器研究开发
工业机器人网络控制与编程